package com.frejoys.service;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.frejoys.common.dto.admin.*;
import com.frejoys.common.dto.common.UserIdDto;
import com.frejoys.common.dto.common.login.LoginDto;
import com.frejoys.common.dto.common.login.WxH5LoginDto;
import com.frejoys.common.dto.common.login.WxLoginDto;
import com.frejoys.common.dto.common.user.InfoUpDto;
import com.frejoys.common.vo.admin.AdminListVo;
import com.frejoys.common.vo.admin.UserAgentVo;
import com.frejoys.common.vo.admin.UserVo;
import com.frejoys.common.vo.common.LoginVo;
import com.frejoys.common.vo.common.TokenVo;
import com.frejoys.common.vo.common.UserDetailsVo;
import com.frejoys.dao.entity.User;

import java.util.List;

public interface UserService extends IService<User> {

    default User getOnly(QueryWrapper<User> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }

    default User getOnly(LambdaQueryWrapper<User> wrapper) {
        wrapper.last("limit 1");
        return this.getOne(wrapper);
    }

    // 清空用户缓存
    void clearUser(Long userId);

    /**
     * 获取信息
     *
     * @param userId
     * @return
     */
    User getInfo(Long userId);

    /**
     * 获取信息
     *
     * @param dto
     * @return
     */
    User getInfo(UserIdDto dto);

    /**
     * 获取信息
     *
     * @param countryCode
     * @param phone
     * @return
     */
    User getSimpleInfo(String countryCode, String phone);

    /**
     * 根据账户获取用户id和状态
     *
     * @param countryCode
     * @param phone
     * @return
     */
    User getIdStatusByAccount(String countryCode, String phone);

    /**
     * 获取用户头像
     *
     * @param userId
     * @return
     */
    String getAvatarByUserId(Long userId);

    /**
     * 更新密码
     *
     * @param userId
     * @param password
     * @param secret
     * @return
     */
    boolean upPasswordByUserId(Long userId, String password, String secret);

    /**
     * 退出登录
     *
     * @param userId
     * @param site
     * @return
     */
    boolean logout(Long userId, Integer site, Integer siteType);

    /**
     * 删除注销用户
     *
     * @param userId
     * @return
     */
    boolean delInfo(Long userId);

    /**
     * 获取登录数据
     *
     * @param u
     * @param site
     * @return
     */
    LoginVo getUserLoginInfo(User u, Integer site, Integer siteType);

    /**
     * 注册登录账户
     *
     * @param dto
     * @param site
     * @return
     */
    LoginVo login(LoginDto dto, Integer site, Integer siteType);

    /**
     * 登录刷新token
     */
    TokenVo refreshToken(Long userId, Integer site, Integer siteType);

    /**
     * 微信注册登录账户
     *
     * @param dto
     * @param site
     * @return
     */
    LoginVo wxLogin(WxLoginDto dto, Integer site, Integer siteType);

    /**
     * 微信H5注册登录账户
     *
     * @param dto
     * @param site
     * @return
     */
    LoginVo wxH5Login(WxH5LoginDto dto, Integer site, Integer siteType);

    /**
     * 后台用户登陆
     *
     * @param dto
     * @param site
     * @return
     */
    LoginVo adminLogin(AdminLoginDto dto, Integer site, Integer siteType);

    /**
     * 修改用户密码
     */
    boolean changePassword(PasswordChangeDto dto,Long userId);

    /**
     * 获取用户数据
     */
    User getSaveUserInfo(String countryCode, String phone, Integer type, Integer site, String unionid, String openid);

    /**
     * 更新昵称
     *
     * @param userId
     * @param nickname
     * @return
     */
    boolean upNickname(Long userId, String nickname);


    /**
     * 更新头像
     *
     * @param userId
     * @param avatar
     * @return
     */
    boolean upAvatar(Long userId, String avatar);


    /**
     * 更新角色
     *
     */
    boolean upRole(Long userId, Integer role);

    /**
     * 更新信息
     *
     * @param userId
     * @param dto
     * @return
     */
    boolean upInfo(Long userId, InfoUpDto dto);

    /**
     * 获取头像
     *
     * @param userId
     * @return
     */
    String getAvatar(Long userId);

    /**
     * 更新密码
     *
     * @param userId
     * @param password
     * @return
     */
    boolean upPassword(Long userId, String password);

    /**
     * 更新状态
     *
     * @param userId
     * @param status
     * @return
     */
    boolean upStatus(Long userId, Integer status);

    /**
     * 获取用户信息
     * @param userId
     * @param site
     * @return
     */
    UserDetailsVo getUserInfo(Long userId, Integer site);


    /**
     * 查询用户列表
     */
    IPage<UserVo> listUser(UserListDto dto);

    /**
     * 查询商家列表
     */
    IPage<UserVo> listBusiness(UserListDto dto, Integer role);

    // 修改用户角色
    void changeRole(RoleChangeDto dto);

    /**
     * 只查询用户状态和角色
     */
    User getSimpleUser(Long userId);

    /**
     * 只查询用户状态和角色
     */
    List<User> getSimpleListUser(List<Long> userIds);

    /**
     * 后台设置用户管理
     */
    boolean setUserRole(UserRoleDto dto);


    //校验代理人编号是否错误
    long verifyAgentUserId(Long agentUserId);

    //管理查询代理人列表
    IPage<UserAgentVo> agentListInfo(UserNameAndPhoneDto dto);

    //查询代理人列表 +代理组信息
    IPage<UserAgentVo> notGroupingAgentList(UserNameAndPhoneDto dto);



    //查询代理人列表 没有被设置为管理人的代理人
    IPage<UserAgentsVo> notCustodianList(NotCustodianDto dto);

    // 获取用户id，通过手机号
    Long getUserIdByPhone(String phone);

    //根据电话号码查询userId
    Long phoneByUserId(String phone);

    //生成邀请码
    String getAgentCode();

    //查看管理员列表
    IPage<AdminListVo> adminList(UserNameAndPhoneDto dto);

    //代理人列表
    List<UserAgentVo> agentList(UserNameAndPhoneDto dto);
}
